<?php

class Utils
{
	
	/* Fonctions pour rendre compatible avec php 5.2.0 */
	/* Pas de FateTime::diff ni de DateTime::getTimestamp */
	static function getTimestamp(DateTime $date)
	{
		/* 
		 * C'est barbare : on choppe chaque composante de la date
		 * et on génère le timestamp avec mktime
		 */
		return
		mktime(
		intval($date->format("G")),
		intval($date->format("i")),
		intval($date->format("s")),
		intval($date->format("n")),
		intval($date->format("j")),
		intval($date->format("Y"))
		);
	}
	
	/* La date2 par rapport a date1, est-elle plus grande ? (+)
	 * plus petite (-) ?
	 */
	static function diff(DateTime $date1, DateTime $date2)
	{
		$timestamp1 = Utils::getTimestamp($date1);
		$timestamp2 = Utils::getTimestamp($date2);

		if ($timestamp1 >= $timestamp2)
			return '-';
		else
			return '+';
	}
	
	static function DateFormat($date, $format = null)
	{
		$d = new DateTime($date);
		$f = ($format == null) ? 'd/m/Y à H:i' : $format;
		return $d->format($f);
	}
	
	static function format($format, DateTime $date)
	{
		setlocale(LC_TIME, "fr_FR");
		// Ci dessous pour PHP >= 5.3.0
		//return strftime($format, $date->getTimestamp());
		
		// Ci dessous compatible PHP 5.2.0
		/* test */
		/*
		return strftime($format,
		mktime(
		12,
		12,
		0,
		9,
		1,
		2010
		));
		*/
		return strftime($format,
		mktime(
		intval($date->format("G")),
		intval($date->format("i")),
		intval($date->format("s")),
		intval($date->format("n")),
		intval($date->format("j")),
		intval($date->format("Y")))
		);
		
	}
	
	public static function BBCode($text)
	{
		$text = preg_replace('#&lt;b&gt;(.*)&lt;/b&gt;#isU', '<strong>$1</strong>', $text);
		$text = preg_replace('#&lt;i&gt;(.*)&lt;/i&gt;#isU', '<span style="font-variant: italic;">$1</span>', $text);
		$text = preg_replace('#&lt;u&gt;(.*)&lt;/u&gt;#isU', '<span style="text-decoration: underline;">$1</span>', $text);
		$text = preg_replace('#&lt;(c|color)=(.*)&gt;(.*)&lt;/(c|color)&gt;#isU', '<span style="color: $2;">$3</span>', $text);
		$text = preg_replace('#&lt;(s|size)=(.*)&gt;(.*)&lt;/(s|size)&gt;#isU', '<span style="font-size: $2;">$3</span>', $text);
		$text = preg_replace('#&lt;titre&gt;(.*)&lt;/titre&gt;#isU', '</p><h4>$1</h4><p>', $text);
		$text = preg_replace('#&lt;sstitre&gt;(.*)&lt;/sstitre&gt;#isU', '</p><h5>$1</h5><p>', $text);
		$text = preg_replace('#&lt;(l|lien)=(.*)&gt;(.*)&lt;/(l|lien)&gt;#isU', '<a href="$2">$3</a>', $text);
		return $text;
	}
	
	/**
	* @return string La partie du l'URL après le nom du serveur et avant le nom du script PHP.
	* Exemple : http://www.serveur.com/monsite/index.php/... => retourne monsite/
	*/
	public static function getBaseURL()
	{
	return sfConfig::get('sf_relative_url_root', preg_replace('#/[^/]+\.php5?$#', '', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : (isset($_SERVER['ORIG_SCRIPT_NAME']) ? $_SERVER['ORIG_SCRIPT_NAME'] : '')));
	}
	
	public static function linkToPage($url, $page)
	{
		return '<a href="'.$url.'">'.$page.'</a>';
	}
	
	public static function pagination($page, $entries, $by_page, $route, $params)
	{
		$total_pages = ceil($entries/$by_page);
		
		$edge = sfConfig::get('app_pagination_edge');
		$middle = sfConfig::get('app_pagination_middle');
		
		$html = "";
		
		if ($page > 1)
		{
			// On affiche les previous
			$param = $params;
			$param['page'] = $page-1;
			$url = url_for2($route, $param);
			$html .= self::linkToPage($url, '&lt;');
		}
		
		// On vérifie s'il on affiche la pagination en entier ou non
		if ($total_pages < 2 * ($edge + $middle) + 1)
		{
			// Toutes les pages peuvent être affichées
			for ($i = 1; $i <= $total_pages; $i++)
			{
				if ($i == $page)
				{
					$html .= "[$i]";
				}
				else
				{
					$param = $params;
					$param['page'] = $i;
					$url = url_for2($route, $param);
					$html .= self::linkToPage($url, $i);
				}
			}
		}
		else
		{
			// On affiche les '...'
		
			// Gestion des pages au début
			if ($page <= $edge + $middle + 1)
			{
				// La page sélectionnée se trouve dans les premières
				for ($i = 1; $i <= max($page + $middle, $edge); $i++)
				{
					if ($i == $page)
					{
						$html .= "[$i]";
					}
					else
					{
						$param = $params;
						$param['page'] = $i;
						$url = url_for2($route, $param);
						$html .= self::linkToPage($url, $i);
					}
				}
			}
			else
			{
				// La page sélectionnée ne se trouve pas dans les premières
				for ($i = 1; $i <= $edge; $i++)
				{
					$param = $params;
					$param['page'] = $i;
					$url = url_for2($route, $param);
					$html .= self::linkToPage($url, $i);
				}
			}
			// Fin de gestion des pages au début
			
			// Gestion des pages au milieu
			if ($page > $edge + $middle + 1 AND $page < $total_pages - $edge - $middle)
			{
				// La page se trouve dnas les pages du milieu
				$html .= '...';
				for ($i = $page - $middle; $i <= $page + $middle; $i++)
				{
					if ($i == $page)
					{
						$html .= "[$i]";
					}
					else
					{
						$param = $params;
						$param['page'] = $i;
						$url = url_for2($route, $param);
						$html .= self::linkToPage($url, $i);
					}
				}
				$html .= '...';
			}
			else
			{
				// La page ne se trouve pas dans les pages du milieu
				$html .= '...';
			}
			// Fin de gestion des pages au milieu
			
			// Gestion des pages à la fin
			if ($page >= $total_pages - $edge - $middle)
			{
				// La page sélectionnée se trouve dans les dernières
				for ($i = min($page - $middle, $total_pages - $edge + 1); $i <= $total_pages; $i++)
				{
					if ($i == $page)
					{
						$html .= "[$i]";
					}
					else
					{
						$param = $params;
						$param['page'] = $i;
						$url = url_for2($route, $param);
						$html .= self::linkToPage($url, $i);
					}
				}
			}
			else
			{
				// La page sélectionnée ne se trouve pas dans les dernières
				for ($i = $total_pages - $edge + 1; $i <= $total_pages; $i++)
				{
					$param = $params;
					$param['page'] = $i;
					$url = url_for2($route, $param);
					$html .= self::linkToPage($url, $i);
				}
			}
			// Fin de gestion des pages à la fin
		}
		
		if ($page < $total_pages)
		{
			// On affiche les next
			$param = $params;
			$param['page'] = $page+1;
			$url = url_for2($route, $param);
			$html .= self::linkToPage($url, '&gt;');
		}
		
		return $html;
	}
}